package com.adams.access.db.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;

import com.adams.utils.Page;
import com.adams.utils.PropertyFilter;


public interface PageGenericDao<T, PK extends Serializable> extends GenericDao<T, PK> {
	
	/**
	 * 
	 * Description 	: 按HQL分页查询
	 *
	 * @param page
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public Page<T> queryPage(final Page<T> page, final String hql, final Object... values);
	
	/**
	 * 
	 * Description 	: 按HQL分页查询
	 *
	 * @param page
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public Page<T> queryPage(final Page<T> page, final String hql, final Map<String, Object> values);

	/**
	 * 
	 * Description 	: 按Criteria分页查询
	 *
	 * @param page
	 * @param criterions
	 * @return
	 *
	 */
	public Page<T> queryPage(final Page<T> page, final Criterion... criterions);
	
	/**
	 * 
	 * Description 	: 按属性过滤条件列表分页查找对象
	 *
	 * @param page
	 * @param filters
	 * @return
	 *
	 */
	public Page<T> queryPage(final Page<T> page, final List<PropertyFilter> filters);
	
	/**
	 * 
	 * Description 	: 执行count查询获得本次Hql查询所能获得的对象总数
	 *
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public int countHqlResult(final String hql, final Object... values);
	
	/**
	 * 
	 * Description 	: 执行count查询获得本次Hql查询所能获得的对象总数
	 *
	 * @param hql
	 * @param values
	 * @return
	 *
	 */
	public int countHqlResult(final String hql, final Map<String, Object> values);
	
	/**
	 * 
	 * Description 	: 执行count查询获得本次Criteria查询所能获得的对象总数
	 *
	 * @param c
	 * @return
	 *
	 */
	public int countCriteriaResult(final Criteria c);
}
